const http = require("./utils/HTTPUtils.js")
//控制日志是否打印
const isLog = true
App({
  /**
   * 监听加载+
   */
  onLaunch: function() {
    const header = {
      'content-type': 'application/x-www-form-urlencoded'
    }
    http.config.url(this.globalData.url).header(header).isLog(true).showConfig()
    wx.hideTabBar()
    this.getSystemInfo();
    let _this = this
    const log = new this.appLogs()
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框
          wx.getUserInfo({
            success: res1 => {
              // 可以将 res 发送给后台解码出 unionId
              _this.globalData.wxUserInfo = res1.userInfo
              _this.getUserInfo()
              // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }else {
          log.e('用户未授权,无法获取用户信息')
          //未授权 清除所有本地缓存
          wx.clearStorage()
        }
      }
    })
  },

  http: http,

  globalData: {
    //请求地址 本地
    url: "http://10.0.0.121:81/",
    //请求数据地址(线上)
    // url: "https://www.xinwangzn.com/api/",
    //线上微服务
    urlMicro: "http://xinwangzn.com:85/api-conference",
    //上传文件地址
    upFileUrl: "https://xinwangzn.com:84/api/resident/uploadSysImg",
    //小程序ID
    appId: 'wx536750b1a97df172',
    js_code: null,
    //用户信息
    userInfo: null,
    //微信用户信息
    wxUserInfo: null,
    //用于判断是否登录
    accessToken: "",
    //用于token过期刷新accessToken
    refreshToken: "",
    //标题 注意(请在每个 js 里面加入动态设置标题的代码)
    appTitle:"党建",
    //主题色配置
    theme: {
      themeColor: ["#7076E7", "#9576EE", "#F39F34", "#69C4C7"], //主题颜色(从主题色->辅助色)
      titleColor: ["#202323", "#525454", "#838685", "#D8D8D8"], //标题颜色(从标题->分割线)
      titleSize: [40, 36, 32, 30], //标题字体大小(从大字体->小字体)
      contentSize: [30, 28, 26], //内容字体大小(从大字体->小字体)
      commentSize: 22, //注释字体大小
      tabIconColor: "#798CCF", //tab选中图标的颜色
      tabIconSelectedColor: "#D8D8D8", //tab未选中的图标颜色
      elPadding: [15, 32], //页面边距(从上下->左右距离)
      elSpecialPadding: [15, 60], //特殊页面边距(登录页面、)
      btnHeight: [100, 60], //按钮高度(从大按钮->小按钮)
      btnTextSize: [40, 30], //按钮文字大小(从大字体->小字体)
      editBackgroundColor: "#F6F6F7"
    },
    unitCode: "86.001.001.001.001.004.005", //单位编码（本地白莲社区86.001.001.001.001.003.001）（线上86.001.001.001.001.010.002）
    aMapKey: 'e05247d0f7d818289f90d9fb73e9e161',//高德地图 key
    mobileRegexp: /^1[345789]\d{9}$/,
    idCardRegexp: /(^\d{15}$)|(^\d{17}([0-9]|X|x)$)/,
    yardId: "", //院落id
    parentAreaCode: "86.51.01.85.01", //望平社区(本地86.51.01.08.03.01)（线上86.51.01.08.10.02）
    areaCode: "86.51.01.85.01", //暂时未用
    roomId: "", //房间id
    systemInfo: null,//客户端设备信息
    pageNumber: 1,
    pageSize:10,
    pageTotalNumber: 0,
    tabBar: {
      "color": "#838685",
      "selectedColor": "#798CFF",
      "backgroundColor": "#ffffff",
      "borderStyle": "black",
      "list": [{
        "pagePath": "/pages/index/index",
        "iconPath": "icon/home.png",
        "selectedIconPath": "icon/home_selected.png",
        "text": "首页"
      },
      {
          "pagePath": "/pages/mine/mine",
          "iconPath": "icon/my.png",
          "selectedIconPath": "icon/my_selected.png",
          "text": "我的"
        }
      ]
    }
  },

  /**
   * 编辑 tabBar
   */
  editTabbar: function () {
    //隐藏系统tabbar
    wx.hideTabBar()
    let tabbar = this.globalData.tabBar;
    let currentPages = getCurrentPages();
    let _this = currentPages[currentPages.length - 1];
    let pagePath = _this.route;
    (pagePath.indexOf('/') != 0) && (pagePath = '/' + pagePath);
    for (let i in tabbar.list) {
      tabbar.list[i].selected = false;
      (tabbar.list[i].pagePath == pagePath) && (tabbar.list[i].selected = true);
    }
    _this.setData({
      tabbar: tabbar
    });
  },
  getSystemInfo: function () {
    wx.getSystemInfo({
      success: (res)=> {
        this.globalData.systemInfo = res;
      }
    });
  },

  /**
   * 用户登录
   */
  getUserInfo: function(){
    const _this = this
    const http = new this.appHttp()
    const log = new this.appLogs()
    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        _this.globalData.js_code = res.code
        http.get("wechart/mine/authorize",{
          js_code: res.code,
          applet_id: _this.globalData.appId,
          name: _this.globalData.wxUserInfo.nickName,
          head_img: _this.globalData.wxUserInfo.avatarUrl
        }).then((res) => {
          // log.l('登录结果: ' + JSON.stringify(res))
          //设置到全局
          _this.globalData.userInfo = res.data.data
        })
      }
    })
  },
  onShow: function () {
    //隐藏系统tabbar
    wx.hideTabBar();
  },


  /**
   * 日志打印工具类
   * 使用方法:
   * const log = new app.appLogs()
   * log.l(msg)
   */
  appLogs: function () {
    /**
     * 打印普通日志
     * @param msg
     * @param optionalParams
     */
    this.l = function (msg, optionalParams) {
      if (isLog) {
        if (optionalParams === undefined) {
          console.log(msg)
        } else {
          console.log(msg, optionalParams)
        }
      }
    }
    /**
     * 打印 Error 日志
     * @param msg
     * @param optionalParams
     */
    this.e = function (msg, optionalParams) {
      if (isLog) {
        if (optionalParams === undefined) {
          console.error(msg)
        } else {
          console.error(msg, optionalParams)
        }
      }
    }
    /**
     * 打印 info 日志
     * @param msg
     * @param optionalParams
     */
    this.i = function (msg, optionalParams) {
      if (isLog) {
        if (optionalParams === undefined) {
          console.info(msg)
        } else {
          console.info(msg, optionalParams)
        }
      }
    }
    /**
     * 打印 Debug 日志
     * @param msg
     * @param optionalParams
     */
    this.d = function (msg, optionalParams) {
      if (isLog) {
        if (optionalParams === undefined) {
          console.debug(msg)
        } else {
          console.debug(msg, optionalParams)
        }
      }
    }
  },

  /**
   * 网络请求工具类
   * 使用方法 const http = new app.appHttp()
   * http.get(地址,参数).then((成功)=>{
   *     成功处理
   * },(失败)=>{
   *     失败处理
   * })
   */
  appHttp: function () {
    const app = getApp()
    const log = new app.appLogs()
    const _this = this
    /**
     * Get 方法
     * @param url 请求地址
     * @param data 请求参数
     */
    this.get = function (url, data) {
      return this.promise('GET',url, null, data)
    }
    /**
     * Get 方法 微服务
     * @param url
     * @param data
     */
    this.getMicro = function (url, data) {
      return this.promiseMicro('GET',url,null,data)
    }
    /**
     * Get 方法 可自定义 header
     * @param url
     * @param header
     * @param data
     */
    this.getHeader = function (url, header, data) {
      return this.promise('GET', url, header, data)
    }
    /**
     * Get 方法 微服务
     * @param url
     * @param header
     * @param data
     */
    this.getMicroHeader = function (url, header, data) {
      return this.promiseMicro('GET',url,header,data)
    }

    /**
     * Post 方法
     * @param url 请求地址
     * @param data 请求参数
     */
    this.post = function (url, data) {
      return this.promise('POST', url, null, data)
    }
    this.postMicro = function (url, data) {
      return this.promiseMicro('POST', url, null, data)
    }
    /**
     * Post 方法 可自定义 header
     * @param url 请求地址
     * @param header 请求头
     * @param data 请求参数
     */
    this.postHeader = function (url, header, data) {
      return this.promise('POST', url, header, data)
    }
    this.postHeaderMicro = function (url, header, data) {
      return this.promiseMicro('POST', url, header, data)
    }

    /**
     * Put 方法
     * @param url 请求地址
     * @param data 请求参数
     */
    this.put = function (url, data) {
      return this.promise('PUT', url, null, data)
    }
    this.putMicro = function (url, data) {
      return this.promiseMicro('PUT', url, null, data)
    }
    /**
     * Put 方法 可自定义 header
     * @param url 请求地址
     * @param header 请求头
     * @param data 请求参数
     */
    this.putHeader = function (url, header, data) {
      return this.promise('PUT', url, header, data)
    }
    this.putHeaderMicro = function (url, header, data) {
      return this.promiseMicro('PUT', url, header, data)
    }
    /**
     * Delete 方法
     * @param url 请求地址
     * @param data 请求参数
     */
    this.delete = function (url, data) {
      return this.promise('DELETE', url, null, data)
    }
    this.deleteMicro = function (url, data) {
      return this.promiseMicro('DELETE', url, null, data)
    }
    /**
     * Delete 方法
     * @param url 请求地址
     * @param header 请求头
     * @param data 请求参数
     */
    this.deleteHeader = function (url, header, data) {
      return this.promise('DELETE', url, header, data)
    }
    this.deleteHeaderMicro = function (url, header, data) {
      return this.promiseMicro('DELETE', url, header, data)
    }
    /**
     * Promise 实现
     * @param method 请求方法
     * @param url 请求地址
     * @param header 请求头
     * @param data 请求参数
     * @returns Promise 返回结果
     */
    this.promise = function (method, url, header, data) {
      return new Promise(((resolve, reject) => {
        //获取网络类型
        wx.getNetworkType({
          success: res => {
            if (res.networkType !== "none"){
              if (data === undefined || data == null){
                data = {}
              }
              try {}catch (e) {}
              _this.request(method, url, header, data, resolve,reject)
            }else {
              log.l("没有连接到网络")
              wx.showToast({
                title: '网络连接失败',
                icon: "none",
                duration: 3000
              })
            }
          }
        })
      }))
    }

    /**
     * Promise 实现  微服务
     * @param method 请求方法
     * @param url 请求地址
     * @param header 请求头
     * @param data 请求参数
     * @returns Promise 返回结果
     */
    this.promiseMicro = function (method, url, header, data) {
      return new Promise(((resolve, reject) => {
        //获取网络类型
        wx.getNetworkType({
          success: res => {
            if (res.networkType !== "none"){
              if (data === undefined || data == null){
                data = {}
              }
              try {}catch (e) {}
              _this.requestMicro(method, url, header, data, resolve,reject)
            }else {
              log.l("没有连接到网络")
              wx.showToast({
                title: '网络连接失败',
                icon: "none",
                duration: 3000
              })
            }
          }
        })
      }))
    }
    /**
     * 请求方法
     * @param method 请求方法 GET,POST,PUT,DELETE
     * @param url 请求地址
     * @param header 可空，为空则默认
     * @param data 请求参数
     * @param resolve 请求成功处理
     * @param reject 请求失败处理
     */
    this.request = function (method, url, header ,data, resolve, reject) {
      let head = header
      if (header === null || header === undefined) {
        head = {
          'content-type': 'application/x-www-form-urlencoded',
          'Authorization': app.globalData.accessToken
        }
      }
      log.l("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓")
      log.l('<!------------[ ' + url + ' ]------------------------------------------------')
      log.l("请求方法: " + method)
      log.l("请求地址: " + app.globalData.url + url)
      log.l("请求头部: " + JSON.stringify(head))
      log.l("请求参数: " + JSON.stringify(data))
      wx.request({
        method: method,
        url: app.globalData.url + url,
        header: head,
        data: data,
        success: res => {
          if (res.statusCode === 200){
            try{
              log.l("请求结果: " + JSON.stringify(res))
              log.l('--------------[ ' + url + ' ]------------------------------------------------>')
              log.l('↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑')
              resolve(res)
            }catch (e) {}
          }else {
            log.e("请求结果: " + JSON.stringify(res))
            log.e('--------------[ ' + url + ' ]------------------------------------------------>')
            reject(res)
          }
        },
        fail: res => reject(res)
      });
    }

    /**
     *  微服务请求
     * @param method 请求方法 GET,POST,PUT,DELETE
     * @param url 请求地址
     * @param header 可空，为空则默认
     * @param data 请求参数
     * @param resolve 请求成功处理
     * @param reject 请求失败处理
     */
    this.requestMicro = function (method, url, header ,data, resolve, reject) {
      let head = header
      if (header === null || header === undefined) {
        head = {
          'content-type': 'application/x-www-form-urlencoded',
          'Authorization': app.globalData.accessToken
        }
      }
      log.l("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓")
      log.l('<!------------[ ' + url + ' ]------------------------------------------------')
      log.l("请求方法: " + method)
      log.l("请求地址: " + app.globalData.urlMicro + url)
      log.l("请求头部: " + JSON.stringify(head))
      log.l("请求参数: " + JSON.stringify(data))
      wx.request({
        method: method,
        url: app.globalData.urlMicro + url,
        header: head,
        data: data,
        success: res => {
          if (res.statusCode === 200){
            try{
              log.l("请求结果: " + JSON.stringify(res))
              log.l('--------------[ ' + url + ' ]------------------------------------------------>')
              log.l('↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑')
              resolve(res)
            }catch (e) {}
          }else {
            log.e("请求结果: " + JSON.stringify(res))
            log.e('--------------[ ' + url + ' ]------------------------------------------------>')
            reject(res)
          }
        },
        fail: res => reject(res)
      });
    }

    /**
     * 上传文件
     * @param url 上传文件的地址
     * @param header 可空
     * @param filePath 要上传文件资源的路径 (本地路径)
     * @param formData 如果不需要可以传 null 或者 {}
     * @param success 上传成功处理
     * @param fail 上传失败处理
     */
    this.upFile = function (url, header, filePath, formData, success, fail) {
      let head = {}
      if (!(header == null || header === '')){
        head = header
      }
      const uploadTask = wx.uploadFile({
        url: app.globalData.upFileUrl + url,
        header: head,
        filePath: filePath,
        name: 'file',
        formData: formData,
        success: res => success(res),
        fail: res => fail(res)
      })
      uploadTask.onProgressUpdate(res => {
        log.l(JSON.stringify(res))
      })
    }

  },
  /**
   * 判断是否已经登录跳转页面
   */
  isVerifiedLogin: function(url) {
    if (this.globalData.userInfo["user_id"]) {
      wx.navigateTo({
        url: url,
      })
    } else {
      wx.navigateTo({
        url: '/pages/mine/login/login',
      })
    }

  }
})